/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package NovoGame.Arkanoid;

import javax.microedition.lcdui.Graphics;

/**
 *
 * @author Tatiana
 */
public abstract class ArkanoidEntidade {
    //Velha posição
    private int velhaX;
    private int velhaY;
    //Posição atual
    private int x;
    private int y;
    //Tamanho
    private int altura;
    private int largura;
    //Velocidade
    private int velocidadeX;
    private int velocidadeY;
    private int posicaoColisaoX;
    private int velocidadeMaxX;
    private int velocidadeMaxY;
    //Cor
    private int cor;
    //Tipos de colisão.
    static byte COLISAO_NENHUMA = 0;
    static byte COLISAO_ESQUERDA = 1;
    static byte COLISAO_DIREITA = 2;
    static byte COLISAO_CIMA = 4;
    static byte COLISAO_BAIXO = 8;
    /**
     * Metodo responsável para atualizar o estado da entidade.
     */
    abstract public void atualizar();
    /**
     * ArkanoidEntidade para pintar objeto usando Grafics
     */
    abstract public void pintar(Graphics g);
    public int getAltura() {
        return altura;
    }
    public void setAltura(int altura) {
        this.altura = altura;
    }
    public int getCor() {
        return cor;
    }
    public void setCor(int cor) {
        this.cor = cor;
    }
    public int getLargura() {
        return largura;
    }
    public void setLargura(int largura) {
        this.largura = largura;
    }
    public int getVelhaX() {
        return velhaX;
    }
    public void setVelhaX(int velhaX) {
        this.velhaX = velhaX;
    }
    public int getVelhaY() {
        return velhaY;
    }
    public void setVelhaY(int velhaY) {
        this.velhaY = velhaY;
    }
    public int getVelocidadeX() {
        return velocidadeX;
    }
    public void setVelocidadeX(int velocidadeX) {
        this.velocidadeX = velocidadeX;
    }
    public int getVelocidadeY() {
        return velocidadeY;
    }
    public void setVelocidadeY(int velocidadeY) {
        this.velocidadeY = velocidadeY;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public int getPosicaoColisaoX() {
        return posicaoColisaoX;
    }
    public void setPosicaoColisaoX(int posicaoColisaoX) {
        this.posicaoColisaoX = posicaoColisaoX;
    }
    public int getVelocidadeMaxX() {
        return velocidadeMaxX;
    }
    public void setVelocidadeMaxX(int velocidadeMaxX) {
        this.velocidadeMaxX = velocidadeMaxX;
    }
    public int getVelocidadeMaxY() {
        return velocidadeMaxY;
    }
    public void setVelocidadeMaxY(int velocidadeMaxY) {
        this.velocidadeMaxY = velocidadeMaxY;
    }
    /**
     * Checa se teve colisão com o objeto.
     * Verificando qual tipo de colisão ouve.
     */
    public byte colisao(ArkanoidEntidade outra){
        byte colisao = COLISAO_NENHUMA;
        posicaoColisaoX = 0;
        if(this.x<outra.x+outra.largura && this.x+largura>outra.x && this.y<outra.y+outra.altura && this.y+altura>outra.y){
            posicaoColisaoX = outra.x+outra.largura - this.x;
            if(posicaoColisaoX > this.largura){
                posicaoColisaoX -=  outra.largura;
            }else{
                posicaoColisaoX +=  outra.largura;
            }
            // Verifica se a colisão veio do x;
            if(this.x<outra.x+outra.largura && this.x+largura>outra.x && this.velhaY<outra.y+outra.altura && this.velhaY+altura>outra.y){
                if(velhaX < x){
                    colisao |= COLISAO_DIREITA;
                }else{
                    colisao |= COLISAO_ESQUERDA;
                }
            }
            // Verifica se a colisão veio do y;
            if(this.velhaX<outra.x+outra.largura && this.velhaX+largura>outra.x && this.y<outra.y+outra.altura && this.y+altura>outra.y){
                if(velhaY < y) {
                    colisao |= COLISAO_BAIXO;
                } else {
                    colisao |= COLISAO_CIMA;
                }
            }
            // Verifica qualquer outro tipo de colisão
            if(colisao == COLISAO_NENHUMA){
                // Verifica se a colisão veio de ambas os lados
                if(velhaX < x){
                    colisao |= COLISAO_DIREITA;
                }else if(velhaX > x){
                    colisao |= COLISAO_ESQUERDA;
                }
                if(velhaY < y){
                    colisao |= COLISAO_BAIXO;
                }else if(velhaY > y){
                    colisao |= COLISAO_CIMA;
                }
            }
        }
        return colisao;
    }
    /**
     * Colisão é Horizontal
     */
    public boolean colisaoHorizontal(byte colisao){
        return (colisao & (COLISAO_ESQUERDA|COLISAO_DIREITA))>0;
    }
    /**
     * Colisão é Vertical
     */
    public boolean colisaoVertical(byte colisao){
        return (colisao & (COLISAO_BAIXO|COLISAO_CIMA))>0;
    }
}
